\section{Eigengrasps}

\htmlmenu{2}

Eigengrasps define a subspace of a given hand's DOF space. Assuming
the hand has $d$ DOF's, each eigengrasp is a $d$-dimensional vector. A
basis comprising $b$ orthogonal eigengrasps can define a
$b$-dimensional subspace. Additionally, this subspace needs an origin,
which is also a $d$-dimensional vector. This gives the following
options:
\begin{itemize}
\item define a hand posture using $b$ eigengrasp amplitudes (as opposed
  to $d$ DOFs).
\item find the Eigengrasp subspace projection of a given hand posture
  which is not necessarily in this subspace.
\end{itemize}

The term "Eigengrasp" is of our own creation; in the literature
(particularly regarding the human hand), the same concept is often
referred to as "hand synergies".

For a complete discussion on Eigengrasps and their application in
practice, please see the \link{Publications}{sec:publications}
section. This is just a brief overview of Eigengrasps in practice, in
this version of GraspIt!.

This distribution of GraspIt! include Eigengrasp information for many
dexterous hands. For the human hand, we are providing eigengrasp
directions matching those discovered through user studies by Santello
et al. (see M. Santello, M. Flanders, and J. F. Soechting,
\textit{Postural hand synergies for tool use}, Journal of
Neuroscience, vol. 18, no. 23, 1998 for details). The hand model used
in that study had 16 DOF. Therefore, the only the 16-DOF version of
the human hand included with GraspIt! has all 6 eigengrasps discovered
in the study. The 20-DOF version has only the 2 dominant eigengrasps,
and since an empirical mapping was done between 16 DOF and 20 DOF,
they might not be as accurate as the ones provided with the 16-DOF
version.

3 more dexterous hands have eigengrasp information pre-defined in this
version of GraspIt!: the Robonaut hand, the DLR hand and the Barrett
hand. For the anthropomorphic models (Robonaut and DLR) we have
performed an empirical mapping of the 2 dominant eigengrasps from the
human hand to adapt them to the robotic hand kinematics. The Barrett
hand natively only has 4 DOF (it can be considered an eigengrasp hand
by construction, since it has 7 joints). We have still defined 2
eigengrasps empirically, this is the simplest case of using
eigengrasps and it will be used as an example in the rest of this
chapter.

\subsection{Loading Eigengrasp Information}

For any hand model, eigengrasp information can be defined using a text
file which is loaded together with the hand configuration
file. Usually, eigengrasp information files are placed together with
the rest of the information that defines a robot, such as the
configuration file or link geometry files. Here is an example file
defining a 2-dimensional ($b=2$) eigengrasp subspace for the Barrett
hand ($d=4$). The example shown here is found in the file
\texttt{barrett\_eigen.egr} included in this distribution.

\begin{itemize}
\item the first line contains the keyword \texttt{DIMENSIONS} followed
  by the number of DOF's of the hand
\item each eigengrasp begins with the keyword \texttt{EG}. On the next
  line, a single value containing the eigenvalue associated with this
  particular eigengrasp. For now this number is not used anywhere in
  the code, but it might have uses in the future. Finally, on the next
  line, the $d$-dimensional vector that defines the eigengrasp
\item an arbitrary number of eigengrasps can be defined, as long as
  each is formatted as described above. In this example, we define a
  2-dimensional subspace with two eigengrasps. 
\item the origin of the subspace is defined exactly like an
  eigengrasp, but it is preceded by the keyword \texttt{ORIGIN}. If
  no origin is found in the file, the system will use a pre-defined
  subspace origin: for each DOF, the subspace origin is assumed to be
  at ( maxVal - minVal ) / 2
\item the normalization information is optional. If desired, it can be
  defined like an eigengrasp, preceded by the keyword
  \texttt{NORM}. If this information is not present in the file, no
  normalization is used
\end{itemize}

\begin{verbatim}

DIMENSIONS 4

EG
0.51
1.0  0.0  0.0  0.0

EG
0.25
0.0  1.0  1.0  1.0 

ORIGIN
0.0000
1.13 0.79 0.79 0.79

NORM
0.0000
1.57 1.22 1.22 1.22
\end{verbatim}

When loading a robot, GraspIt! will look in the robot configuration
file for information on what eigengrasps file to load (if any). First
comes the keyword \texttt{EigenGrasps}, followed on the next line by
the eigengrasp file to be loaded. The path to the Eigengrasp file is
relative to the robot configuration file. For example, all this
information can be supplied by placing the following lines anywhere in
the hand configuration file (in this example, \texttt{Barrett.cfg}):

\begin{verbatim}
...
EigenGrasps
eiegn/barrett_eigen.egr
...
\end{verbatim}

\subsection{Using eigengrasps}

With the desired hand highlighted in the hand drop-down list, use the
Grasp $\rightarrow$ EigenGrasp Interface menu. Two windows will show up: the
eigengrasp amplitude sliders window and the eigengrasp options window.
If no eigengrasp information has been loaded from a file, the system
will display the trivial eigengrasp set, where each eigengrasp
corresponds to exactly one DOF and the eigengrasp subspace is
identical to the DOF space.
\begin{itemize}
\item at launch, the hand is placed in a neutral position (all
  eigengrasp amplitudes are 0). By moving each slider you control the
  amplitude of the respective eigengrasp. You can also move individual
  DOF's like you normally would in GraspIt. The result depends on the
  mode of operation, defined by the \texttt{Rigid} checkbox as
  described below.
\item rigid mode: only movement in Eigengrasp space is allowed. If an
  individual DOF is changed, had posture is projected back into
  eigengrasp space.
\item non-rigid mode: free movement is allowed. When an individual DOF
  is changed, the eigengrasp sliders still show the eigengrasp
  amplitudes of the projection in eigengrasp space. However, hand
  posture is allowed to leave eigengrasp space.
\item collision detection is \textbf{not performed} while moving using
  the eigengrasp interface. This is temporary, we will probably add it
  in soon.
\item when moving the eigengrasp sliders, motion is stopped as soon as
  any DOF reaches its joint limit. Alternatively, it could be possible
  to just block the stopped DOF and allow others to move, but this
  would take the hand out of eigengrasp space. See code
  (\texttt{eigengrasp.h}) for details.
\end{itemize}
